﻿/**
 * Funcionamiento básico predeterminado de un formulario de contacto con campos, marca de campo obligatorio y botón enviar.
 * Eventos que difunde: "campo_setFocus", "campo_killFocus", "campo_changed" (los mismos que TextField con el prefijo "campo_"
 */
import EventDispatcherWrapper;

import org.casalib.util.ArrayUtil;
 
class Formulario {
	private var campo_array, marca_array:Array;
	
	private var _receptor:Object;
	private var Formulario_4689_ref:Formulario;
	
	// alias
	public var wrap:Function = aplicar;

	public static function aplicar(receptor:Object):Formulario {
		var formulario:Formulario = new Formulario(receptor);
		return formulario;
	}

	public function Formulario(receptor:Object) {
		var i, j:Number;
		trace("Formulario, receptor: " + receptor);
		EventDispatcherWrapper.wrap(receptor);
		receptor.enviar = enviar;
		receptor.borrar = borrar;
		receptor.Formulario_4689_ref = this;
		
		campo_array = new Array();
		i=1;
		while(receptor["campo_"+i]!=undefined) {
			Campo.aplicar(receptor["campo_"+i]);
			campo_array.push(receptor["campo_"+i]);
			receptor["campo_"+i].addEventListener2("changed", this, "propagar");
			receptor["campo_"+i].addEventListener2("setFocus", this, "propagar");
			receptor["campo_"+i].addEventListener2("killFocus", this, "propagar");
			i++;
		}
		
		marca_array = new Array();
		for(j=1; j<i; j++) {
			if(receptor["marca_"+j]!=undefined)
				marca_array.push(receptor["marca_"+j]);
			else
				marca_array.push({});
		}
		
		receptor.boton_enviar.addEventListener2("release", this, "propagar_2");
		
		Campo.aplicar(receptor.resultado);
		
		_receptor = receptor;
	}

	// Propagación de eventos de los campos de texto.
	public function propagar(evt:Object):Void {
		//trace("propagar, texto: " + evt.target.texto.text + ".");
		var indice:Number = ArrayUtil.indexOf(campo_array, evt.target);
		
		evt.campo = evt.target;
		evt.target = _receptor;
		evt.formulario = _receptor;
		evt.marca = marca_array[indice];
		evt.resultado = _receptor.resultado;
		evt.type = "campo_" + evt.type;
		
		_receptor.dispatchEvent(evt);
	}
	
	// Propagación de eventos del botón enviar.
	public function propagar_2(evt:Object):Void {
		evt.boton = evt.target;
		evt.target = _receptor;
		evt.formulario = _receptor;
		evt.type = "boton_enviar_release";
		evt.resultado = _receptor.resultado;
		
		_receptor.dispatchEvent(evt);
	}
	
	private function enviar(destino:String, datos:Object):Void {
		trace("Formulario.enviar");
		var loadVars:LoadVars = new LoadVars();
		for( var p:String in datos) {
			trace(p + ": " + datos[p] + ".");
			loadVars[p] = datos[p];
		}
		loadVars.sendAndLoad(destino, loadVars, "POST");
	}
	
	private function borrar() {
		var i:Number;
		for(i=0; i<Formulario_4689_ref.campo_array.length; i++) {
			Formulario_4689_ref.campo_array[i].valor = "";
		}
	}
}